import SparkMD5 from 'spark-md5'

export function getFileChunkListAndHash(file: File): Promise<{ chunkList: Blob[]; hash: string }> {
  return new Promise((resolve) => {
    // 1. 定义好一些需要的变量
    const chunkList: Blob[] = []
    const chunkSize = 1024 * 1024 * 5 // 切片大小 5M
    const chunks = Math.ceil(file.size / chunkSize) // 切片数量
    let currentChunk = 0 // 当前切片下标
    const spark = new SparkMD5.ArrayBuffer() // spark 对象

    // 2. 定义一个 frOnload 函数，用于 fileReader.onload
    function frOnload(e: Event) {
      // 文件内容
      const result = (e.target as FileReader).result as ArrayBuffer
      // 增加计算hash
      spark.append(result)
      // currentChunk++
      currentChunk++
      // 判断是否还有下一个切片
      if (currentChunk < chunks) {
        // 开始读下一个
        loadNext()
      } else {
        // 读取完成
        const hash = spark.end()
        resolve({ chunkList, hash })
        // console.log('读取完成', hash)
      }
    }

    // 2. 定义一个 loadNext 函数
    function loadNext() {
      // console.log('loadNext', currentChunk)
      // 1. 创建 FileReader 对象
      const fileReader = new FileReader()
      // 2. 监听 onload
      fileReader.onload = frOnload
      // 3. 计算 start 与 end
      const start = currentChunk * chunkSize
      const end = start + chunkSize >= file.size ? file.size : start + chunkSize
      // 4. 开始切
      const chunk = file.slice(start, end)
      chunkList.push(chunk)
      // 5. 开始读取
      fileReader.readAsArrayBuffer(chunk)
    }

    // 3. 默认调用一次 loadNext
    loadNext()
  })
}
